interface Customer {
  custname: string
  buymoney: number
}

type custFuncType = (cust: Customer) => string // 函数类型
//（1）infer 出现在 extends 条件语句后的函数类型的参数类型位置上
/**
 * 也就是 type inferType<custFuncType>= (cust: Customer) => string extends (params:infer P)=>any?P:T
 * 那么为什么这里成立呢？
 * 1、返回值 (cust: Customer) => string 的返回值是 string ，(params:infer P)=>any 的返回值是 any ,any 可以代表任何类型 成立
 * 2、params:infer P 中的 P 可以接受任何类型 所以 cust: Customer 中的 Customer可以被接受 成立
 * 所以 P : T 输出 P ，P 也就是 Customer
 */
type inferType<T> = T extends (params: infer P) => any ? P : T
type inferResultType = inferType<custFuncType> // type inferResultType = Customer

/**
 * 不成立情况
 * (cust: Customer, str: String) => string 和 (params: infer P) => any 不兼容
 * 因为 custFuncType2 是两个参数的，多可以接受少，少不能接受多
 * 所以不成立 返回 T , T 就是传递过来的 custFuncType2
 */
type custFuncType2 = (cust: Customer, str: String) => string // 函数类型
type inferType2<T> = T extends (params: infer P) => any ? P : T
type inferResultType2 = inferType2<custFuncType2> // type inferResultType2 = (cust: Customer, str: String) => string

export {}
